//package com.zhijie.common.config;
//
//import com.zhijie.base.entity.DictReplace;
//import com.zhijie.common.util.SpringUtil;
//import org.apache.commons.lang.StringUtils;
//import org.apache.ibatis.executor.parameter.ParameterHandler;
//import org.apache.ibatis.executor.resultset.ResultSetHandler;
//import org.apache.ibatis.plugin.*;
//
//import java.lang.reflect.Field;
//import java.lang.reflect.InvocationTargetException;
//import java.sql.PreparedStatement;
//import java.sql.Statement;
//import java.util.List;
//import java.util.Properties;
//
//@Intercepts({
//        @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class}),
//        @Signature(type = ParameterHandler.class, method = "getParameterObject", args = {Statement.class})
//})
//public class DictReplaceInteceptor implements Interceptor {
//    /**
//     * 实现 ApplicationContextAware 接口的类包含获取spring容器中的bean的静态方法
//     */
//    private SpringUtil spring;
//
//    @Override
//    public Object intercept(Invocation invocation) throws Throwable {
//        String methodName = invocation.getMethod().getName();
//        if (StringUtils.equals("handleResultSets", methodName)) {
//            //todo 查询封装
//            return handleResultSets(invocation);
//        }
//        if (StringUtils.equals("getParameterObject", methodName)) {
//            //todo 查询保存
//            return invokeSetParameter(invocation);
//        }
//        return null;
//    }
//    private Object invokeSetParameter(Invocation invocation) throws Exception {
//
//        ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
//        PreparedStatement ps = (PreparedStatement) invocation.getArgs()[0];
//        Field[] declaredFields = parameterHandler.getClass().getDeclaredFields();
//        for (Field field : declaredFields) {
//            DictReplace dictReplace = field.getAnnotation(DictReplace.class);
//            if (dictReplace != null) {
//
//            }
//        }
//
//        return null;
//    }
//
//    private List<Object> handleResultSets(Invocation invocation) throws InvocationTargetException, IllegalAccessException {
//        //因为 handleResultSets  方法执行结束后可以收到一个list类型的数据结果集，所以虽然该方法的目的是用于结束本次拦截，执行预定方法（handleResultSets）方便下次拦截
//        List<Object> results = (List<Object>) invocation.proceed();
//        try {
//            //自定义方法用于判断对象是否为空
//            if (!results.isEmpty()) {
//                Class<?> cls = results.get(0).getClass();
//                // 获取private修饰的成员变量  获得某个类的所有声明的字段，即包括public、private和proteced，但是不包括父类的申明字段。
//                Field[] fields = cls.getDeclaredFields();
//                for (Object result : results) {
//
//                    for (Field field : fields) {
//                        //获取我们自定义的注解
//                        DictReplace dictReplace = field.getAnnotation(DictReplace.class);
//                        //如果存在这个注解 我们在执行后续方法
//                        if (dictReplace != null) {
//                            //获取注解属性值
//                            String dictIdFieldName = dictReplace.dictIdFieldName();
//                            Field idField = null;
//                            if (StringUtils.isNotEmpty(dictIdFieldName)) {
//                                //获取实体类对应字段
//                                idField = cls.getDeclaredField(dictIdFieldName);
//                            } else {
//                                //获取实体类字段名称
//                                String fieldName = field.getName();
//                                idField = cls.getDeclaredField(fieldName);
//                            }
//                            //允许我们在用反射时访问私有变量
//                            idField.setAccessible(true);
//                            //从返回值中获得字段对应的 值
//                            Object dictId = idField.get(result);
//                            field.setAccessible(true);
//                            if (dictId != null) {
//                                //用字典id查询出字典名称 并替换结果集中的值
//                                field.set(result, "gfafdsafa");
//                            }
//                        }
//                    }
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            return results;
//        }
//    }
//
//    @Override
//    public Object plugin(Object target) {
//        // 读取@Signature中的配置，判断是否需要生成代理类
//        if (target instanceof ResultSetHandler || target instanceof ParameterHandler) {
//            return Plugin.wrap(target, this);
//        } else {
//            return target;
//        }
//    }
//
//    @Override
//    public void setProperties(Properties properties) {
//    }
//}
